package com.mars.admin.modules.activity.vo;


import com.fasterxml.jackson.annotation.JsonFormat;
import com.mars.admin.modules.goods.entity.Goods;
import com.mars.admin.modules.user.vo.UserInfoVO;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 推荐(精选)活动VO对象
 */
@Data
public class ActivityVO {
    /**
     * 活动ID
     */
    @Id(keyType = KeyType.Auto)
    @Schema(description = "活动ID", example = "1")
    private Long id;

    /**
     * 分类ID
     */
    @Schema(description = "分类ID", example = "1")
    private Long categoryId;

    /**
     * 发布者用户ID
     */
    @Schema(description = "发布者用户ID", example = "1")
    private Long userId;

    /**
     * 发布者用户信息
     */
    @Schema(description = "发布者用户信息")
    private UserInfoVO user;

    /**
     * 活动标题
     */
    @Schema(description = "活动标题", example = "周末登山活动")
    private String title;

    /**
     * 封面图片
     */
    @Schema(description = "封面图片", example = "https://example.com/cover.jpg")
    private String coverImage;

    /**
     * 活动图片集合
     */
    @Schema(description = "活动图片集合", example = "[\"https://example.com/1.jpg\"]")
    private String images;

    /**
     * 活动礼品ID
     */
    @Schema(description = "活动礼品ID", example = "1")
    private Long giftId;

    /**
     * 活动礼品信息
     */
    @Schema(description = "活动礼品信息", example = "一瓶可乐")
    private Goods gift;

    /**
     * 活动标签
     */
    @Schema(description = "活动标签", example = "[\"户外\", \"登山\", \"健身\"]")
    private String tags;

    /**
     * 活动地点
     */
    @Schema(description = "活动地点", example = "香山公园")
    private String location;

    /**
     * 开始时间
     */
    @Schema(description = "开始时间", example = "2025-01-15 09:00:00")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    @Schema(description = "结束时间", example = "2025-01-15 17:00:00")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;

    /**
     * 报名开始时间
     */
    @Schema(description = "报名开始时间", example = "2025-01-14 23:59:59")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime registrationStartTime;

    /**
     * 报名结束时间
     */
    @Schema(description = "报名结束时间", example = "2025-01-14 23:59:59")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime registrationEndTime;

    /**
     * 报名人数
     */
    @Schema(description = "报名人数")
    private Integer registrationParticipants;

    /**
     * 报名用户列表
     */
    @Schema(description = "报名用户列表")
    private List<UserInfoVO> registrationUsers;

    /**
     * 活动价格
     */
    @Schema(description = "活动价格", example = "99.00")
    private BigDecimal price;

    /**
     * 联系人
     */
    @Schema(description = "联系人", example = "张三")
    private String contactPerson;

    /**
     * 活动描述
     */
    @Schema(description = "活动描述", example = "一起去登山，感受大自然的魅力")
    private String description;

    /**
     * 详细地址
     */
    @Schema(description = "详细地址", example = "北京市海淀区香山路")
    private String address;

    /**
     * 纬度
     */
    @Schema(description = "纬度", example = "39.9042")
    private BigDecimal latitude;

    /**
     * 经度
     */
    @Schema(description = "经度", example = "116.4074")
    private BigDecimal longitude;

    /**
     * 地区ID
     */
    @Schema(description = "地区ID", example = "1")
    private Long regionId;

    /**
     * 最大参与人数，0表示不限制
     */
    @Schema(description = "最大参与人数", example = "20")
    private Integer maxParticipants;

    /**
     * 最小参与人数
     */
    @Schema(description = "最小参与人数", example = "5")
    private Integer minParticipants;

    /**
     * 当前用户报名状态
     */
    @Schema(description = "当前用户报名状态")
    private boolean signUpStatus;

    /**
     * 当前用户支付状态
     */
    @Schema(description = "当前用户支付状态")
    private Integer paymentStatus;

    /**
     * 是否免费：0-收费，1-免费
     */
    @Schema(description = "是否免费", example = "0")
    private Integer isFree;
}
